package com.qfjy.project.weixin.api.tuling;

import com.qfjy.common.utils.redis.SysConfigRedisUtils;
import com.qfjy.project.weixin.api.tuling.bean.InputText;
import com.qfjy.project.weixin.api.tuling.bean.Perception;
import com.qfjy.project.weixin.api.tuling.bean.TulingBean;
import com.qfjy.project.weixin.api.tuling.bean.UserInfo;
import com.qfjy.project.weixin.util.WeixinUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

/**
 * @ClassName TulingUtil
 * @Description TODO 图灵聊天 API文档教程：
 *   https://www.kancloud.cn/turing/www-tuling123-com/718227
 * @Author guoweixin
 * @Date 2022/11/30
 * @Version 1.0
 */
@Component
public class TulingUtil {
    /**图灵聊天机器人API接口  POST*/
    private static String TULING_POST_URL="http://openapi.turingapi.com/openapi/api/v2";

    @Autowired
    private SysConfigRedisUtils sysConfigRedisUtils;



    @Autowired
    private RestTemplate restTemplate;

    /**
     * 封装请求参数
     * @param msg  输入的文本信息
     * @return
     */
    public JSONObject requestJSONObject(String msg,String apiKey){
        /**
         * 1、封装请求参数
         */
        TulingBean tulingBean=new TulingBean();
        tulingBean.setReqType(0);

        Perception perception=new Perception();
        InputText inputText=new InputText();
        inputText.setText(msg);
        perception.setInputText(inputText);
        tulingBean.setPerception(perception);

        UserInfo userInfo=new UserInfo();
        userInfo.setApiKey(apiKey);
        userInfo.setUserId("java2204");
       // userInfo.setUserId(sysConfigRedisUtils.getStringValueByKey("userId"));

        tulingBean.setUserInfo(userInfo);

        //Java Bean转换成JSON对象
        JSONObject jsonObject= JSONObject.fromObject(tulingBean);

        return jsonObject;
    }

    public String  responseMessage(JSONObject jsonObject){

        /**
         * 2、发送请求 POST请求
         * JDK原生URLConnection
         * Apache：HttpClient
         * Spring：RestTemplate
         * 自定义封装：URLConnection封装: WeixinUtils
         */
        String result=restTemplate.postForObject(TULING_POST_URL,jsonObject,String.class);

        /**
         * 3、响应解析数据
         */
        JSONObject jsonObject1=JSONObject.fromObject(result);

        JSONArray jsonArray= (JSONArray) jsonObject1.get("results");

        JSONObject jsonObject2= (JSONObject) jsonArray.get(0);

        JSONObject jsonObject3= (JSONObject) jsonObject2.get("values");
        result= jsonObject3.getString("text");

        return result;
    }

    /**
     * 对外调用方法
     * @param msg
     * @return
     */
    public  String sendMessage(String msg,String apiKey) {

          //1、请求入参封装
       // String apiKey="acc513be8b5e4b26929247e83132f116";
       JSONObject jsonObject= this.requestJSONObject(msg,apiKey);
        //2、响应结果
       return  this.responseMessage(jsonObject);
    }

    /**
     1、免费（系统会默认赠送5个机器人apiKey)。
     2、每个机器人 每天免费使用100次聊天。
     3、如果每个机器人聊天用完了100次，系统再请求返回： 请求次数超限制!
     4、每个机器人到了第二天凌晨0：0 又继续恢复了100次请求能力。

     TODO 如何让机器人能够尽最大的限度进行智能回复？

     1、收集更多的机器人的KEY。如果机器人都用完了，默认回复：我今天累了，明天再找我聊天吧

     */

    /**机器人存储介质（Redis/MYSQL/JVM）  */
    public static String[] API_KEYS={
            "acc513be8b5e4b26929247e83132f116",
            "911ea1eef67843449750dc7f19fb3d8d",
            "a2248ded1f8842729a36589d1829a986"
    };
    /**机器人 当前使用下标索引KEY */
    private static int KEY_INDEX=0;
    /**对 判断当天整个机器人团队是否可用 true可用 false 不可用*/
    public  static boolean TULING_KEY_FLAG=true;

    /**全局控制锁 true锁开启（智能聊天不能用）， flase锁关闭（智能聊天可用） */
    public static boolean TULING_LOCK=false;
    /**
     * TODO 对外提供用于访问调用方法
     */
    public String sendMsg(String msg){

        if(TULING_LOCK==true){
            return "功能暂不可用";
        }

        if(TULING_KEY_FLAG==false){
            return "我今天累了，明天再找我聊天吧";
        }

       String result=this.sendMessage(msg,API_KEYS[KEY_INDEX]);

       if("请求次数超限制!".equals(result)){
           //调用下一个机器人KEY下标
           KEY_INDEX++;

           if(KEY_INDEX>=API_KEYS.length){

               KEY_INDEX=0;
               //机器人不可用
                TULING_KEY_FLAG=false;

               return "我今天累了，明天再找我聊天吧";
           }

           return  this.sendMsg(msg);
       }


        return result;
    }

    /**
     * 凌晨0：0分恢复机器人继续提供服务的能力   定时任务
     */
    //@Scheduled(cron = "")
    public void  tulingTask(){
        KEY_INDEX=0;
        TULING_KEY_FLAG=true;
    }


}
